Skip to content

EVGAP-02:契约修订至 v0.2.0,运行降级为检索候选层(EVGAP-02 未解除) - #62

Merged
leezx merged 5 commits into
mainfrom
task_20260805_evgap-02-extraction-result
Aug 6, 2026
Merged

EVGAP-02:契约修订至 v0.2.0,运行降级为检索候选层(EVGAP-02 未解除)#62
leezx merged 5 commits into
mainfrom
task_20260805_evgap-02-extraction-result

Conversation

@leezx

@leezx leezx commented Aug 5, 2026

Copy link
Copy Markdown
Owner

本轮只补正式受审包,未改任何语义

契约 v0.2.0 未动、tests/ 未动、disposition 逻辑未动、无新 finding、无新规则、
未改 target 轴、未补 admission binding、未执行 EVGAP-01、未解除 EVGAP-02

本轮仓库侧改动仅两处:handoff 的包信息段、一条 worklog。

唯一正式受审包

文件名 gen_iet_evgap_02_crc_linkage_20260805T190453Z_rev3.zip
ZIP SHA-256 81baa45f23f180c68b16d18c83284b60bdee725c017e668e590d4e80b04176e9
大小 46,292 bytes
文件数 8(ZIP 内 9 个条目,多出的一条是目录条目)
revision 3

上一版声明的 ef268fd2… 作废——包内新增 verify_package.py,内容变了哈希必然变。

handoff、本 PR body、source_manifest.json 三处写的是同一个文件名、同一个 SHA-256、
同一个文件数、同一个 revision。

包内数据

retrieval_candidates      979
linkage_assertions          0   (仅 header)
pair_linkage_disposition  369

L3-00  27      L3-02  0      L3-04  0
L3-01 342      L3-03  0      L3-05  0
  • Undisclosed / EDBN / AG7:各 9 个 pair,全部 L3-00
  • CA19-9:9 个 pair 全部 L3-01identity_resolution_status = resolved_as_non_protein_antigen
  • retrieval_candidates.tsvrecord_status = retrieved_candidatelinkage_validated = false
    may_support_lock_03 = false不含 linkage_class
  • 三组 refs(supporting_evidence_refs / class_d_evidence_refs / other_cancer_evidence_refs
    在 369 行中全部为空
  • 369 行 may_advance_to_level_02 = false
  • 无 RETAIN、无 EXCLUDE

包内自带验证脚本

python3 verify_package.py .
python3 verify_package.py . --zip ../<pkg>.zip --zip-sha256 <expected>

只读包内文件,无网络、无写入、不依赖包外路径,解压即可运行,退出码 0 表示全通过。

一次性检查:ZIP 与逐文件哈希、字节数、文件数、清单未遗漏文件、schema、
979 / 0 / 36927 / 342、其余四条规则为 0CA19-9、三组 refs 全空、
无 RETAIN/EXCLUDE、EVGAP-02 未解除。

从全新解压目录实测(含 ZIP 哈希校验):65/65 MATCH,退出码 0。

一处上一版 handoff 的笔误已更正

pair_linkage_disposition.tsv 曾被写成 4c4def27…,那其实是 run_report.md 的哈希。
真实值 33674913…。本轮哈希表由 source_manifest.json 直接生成,不再手抄。

状态未变

EVGAP-02 未解除。ADC_POOL_LEVEL_01_ACCEPTED 不成立。

Executed the Tier 1 extraction authorised by PR #61, whose only blocker was its
own approval. Every artefact is external; this PR carries a handoff and a worklog
entry.

Reachability was tested before executing, because the contract makes an
unreachable source a recorded fact rather than a silent skip. All six required
endpoints answered: PubMed and PMC via NCBI E-utilities, ClinicalTrials.gov API
v2, GEO via E-utilities db=gds, TCGA via the GDC genes API, and the Human Protein
Atlas search API. 451 searches, zero unreachable, 41 of 41 targets complete at
endpoint granularity, and all 369 pairs complete on the class D layer.

LOCK-03 came out at 168 L3-02 retain/active, 192 L3-03 defer/hold and 9 L3-05
EXCLUDE_FROM_ACTIVE_POOL/reactivation-eligible. L3-01 and L3-04 are vacuous this
run: no pair had an incomplete search and no other-cancer-only evidence was
collected. The canonical context retains 40 of 41 targets because it needs only
A/B/C evidence; the eight subgroups retain between 6 and 33 because each also
needs class D context enrichment, and that gap is exactly what the 192 holds are.

Evidence strength, stated plainly rather than buried: all 7,067 rows are
machine_retrieved_requires_human_review with evidence_direction unknown. They are
public records retrieved by the frozen queries, with PMIDs, PMCIDs, NCT numbers
and GEO accessions that resolve, but their contents were not read. Under
DECISION-02, accepted in PR #58, machine-retrieved evidence satisfies LOCK-03
existence while barring the pair from Level 02. So the 168 active pairs mean a
CRC-specific linkage record exists pending review, not that linkage is
established.

Only EDBN reached L3-05 across all nine contexts, and that outcome is reversible:
not scientific disproof, not killed, reactivation-eligible, still in the Eligible
Universe Index.

One defect of mine, found by self-check and repaired: the first evidence table
lacked pair_id, clinical_context_id, context_specific and linkage_outcome, and
because A/B/C are searched once per target a single row could not carry a unique
pair_id, leaving VAL-L16 unsatisfiable. I had not aligned "searched per target"
with "recorded per pair". Fixed by conforming the output to the frozen schema
rather than amending the contract: target-level records were expanded into 7,067
pair-level rows with no network call repeated and no retrieved fact altered.

All twenty contract validation rules VAL-L01 through VAL-L20 were checked against
the actual artefacts and all passed. The package is at
external:result/gen_iet_evgap_02_crc_linkage_20260805T190453Z.zip, 148063 bytes,
SHA-256 9c9c184e7b66e2999950831a18e059847c3b7dfd4a5b6f92ac78ac9dce259ece.

No Gate run, no score, no T2 or T7 assessment, no ranking, no Tier, no asset or
experimental recommendation, no target or context added, no Tier 2 database
opened, no quarantined artefact used. EVGAP-02 is NOT lifted by this PR and
EVGAP-01 is untouched, so Level 01 remains unexecutable.

338 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…act to v0.2.0

PR #62 review: the run registered search hits as linkage evidence. Verified
against the actual files first — every point holds. All 7,067 rows carried
evidence_direction=unknown, and no assertion-bearing field was populated
anywhere: prevalence empty in all rows, is_adc_efficacy_evidence false in all,
protein_or_rna unresolved in all 5,699 literature rows. Not one extracted
assertion.

Root cause is the contract. v0.1.0 required evidence_direction as a column but
no rule required it to be resolved, and nothing constrained where linkage_class
came from — so it came from the query category. A fully compliant run therefore
produced 168 RETAIN.

Contract v0.2.0 adds the missing layer: L-RETRIEVAL / L-ASSERTION /
L-DISPOSITION, six assertion elements with assertion_direction=unknown banned,
identity_resolution with rule L3-00, per-endpoint admissibility, and
VAL-L21..VAL-L28. L3-00 reuses the frozen LOCK-03 outcome
linkage_evidence_missing rather than introducing one, because
identity_unresolved belongs to LOCK-01's vocabulary.

The run is rebuilt as an L-RETRIEVAL product with no network call repeated and
no record discarded: 979 distinct records (the 7,067 figure was 979 replicated
across 9 contexts), zero assertions, and all 369 pairs deferred — 36 under
L3-00 for the four unresolvable entities, 333 under L3-01. EVGAP-02 stays open.

GAP-P07 recorded, not fixed: four of the 41 frozen targets are not resolvable
protein entities. Fixing the axis here would be a silent axis change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@leezx

leezx commented Aug 5, 2026

Copy link
Copy Markdown
Owner Author

第二轮修订:结论成立,已降级为检索候选层,契约修订至 v0.2.0

在改动任何东西之前,先对实际文件逐条核验。审核意见全部成立。

比审核描述更彻底的一点

不只是 evidence_direction = unknown——没有任何一行带有已解析的断言字段
positive_fraction_or_prevalence 在 7,067 行中全为空is_adc_efficacy_evidence 全为 false
malignant_cell_attribution 全为 unresolvednot_applicable,5,699 条文献行的
protein_or_rna 全为 unresolved一条已抽取的断言都没有。

一处需要更正的细节

审核说 TCGA 与 HPA 的命中被算作 A 类证据。实测它们没有产生任何证据行——
source_ref 前缀只有 PMC 3,240/PubMed 2,459/ClinicalTrials.gov 702/GEO 666。
原则完全成立,实际的实例是 GEOdb=gds 元数据命中被登记为 666 行 A 类。
v0.2.0 把三个 dataset endpoint 一并禁用为 A 类依据,同时保留其必查地位。

一处比审核意见更严重的发现

Undisclosed 不是实体,是缺失值占位符,却被当作基因符号检索:PMC/A 返回 1,384 条,产出 1 个 RETAIN。
CA19-9(糖类抗原,无 HGNC 符号):PMC/A 14,200 条,9 个 pair 中 8 个 RETAIN

EDBN:11 个 endpoint 全部 0 命中,9 个 pair 落 L3-05 EXCLUDE。它疑指 fibronectin 的
extra domain B(标准符号 FN1)——被排除的唯一原因是这个缩写不通行于文献。
消歧失败被当成了完整检索后的阴性结论。

自查发现、审核未提的第三项缺陷

未披露的检索截断。 451 次检索报告命中合计 718,140,实际登记 979 条;
333/451 次被截断,多数每组只留 3 条。revision 1 未声明此上限却宣称检索完整。

根因在契约,不只在执行

v0.1.0 把 evidence_direction 列为必需列却无任何规则要求其被解析
linkage_class 也无规则约束其来源,于是由查询类别决定。
一次完全合规的执行因此产出 168 条 RETAIN。 故修在契约。

契约 v0.2.0

  • 三层:L-RETRIEVALmay_support_lock_03: false)/L-ASSERTIONL-DISPOSITION(只能引用 assertion)
  • assertion_requirements 六要件,硬性禁止 assertion_direction = unknownVAL-L21
  • linkage_class 由内容判定;候选表改记 query_class_label不得含 linkage_classVAL-L25
  • identity_resolution + 新规则 L3-00(优先级最前)。关键是不对称:未消歧实体既不得 RETAIN,也绝不得 EXCLUDE
  • endpoint_evidence_admissibility 逐 endpoint 写明命中证明什么、不证明什么;ClinicalTrials.gov 须五个结构化字段 + 同臂VAL-L28
  • search_complete 扩为四层,含 assertion 抽取完成
  • 新增 VAL-L21..VAL-L28

L3-00 不引入新 outcome:LOCK-03 词表由 PR #57 冻结、其中没有 identity_unresolved
(只属 LOCK-01),故复用 linkage_evidence_missing,身份信息另由 identity_resolution_status 列承载。

结果降级(revision 2)

revision 1 revision 2
证据表 pair_linkage_evidence.tsv 7,067 行 撤销 → retrieval_candidates.tsv 979 + linkage_assertions.tsv 0
L3-02 RETAIN 168 0
L3-03 192 0
L3-05 EXCLUDE 9 0
369 pair 三分 全部 DEFER / holdL3-00 36 + L3-01 333)

未重复任何网络调用、未丢弃任何已检索记录。
「7,067 条证据」实为 979 条记录乘以 9(A 2808/9=312、B 2295/9=255、C 1746/9=194、D 218 不复制)。

上游缺陷 GAP-P07(登记,不修)

PR #58 冻结的 41 个 target 中至少四个不是可消歧的蛋白实体。EVGAP-02 无权改轴——
在本契约内给 Undisclosed 编身份等于静默改轴。

值得注意:binding 本身已察觉这一点,它把 identity_unresolved 列入 unavailable_outcomes
理由是「已批准层没有身份解析结论字段」。四个实体因此以 E1-05 留在轴上。
缺陷在 PR #58 时已可见,只是当时无法表达。 修复须另开 PR,会改动 41/369 两个冻结计数。

验证

  • 外部产物经 25 项 v0.2.0 规则核验全通过
  • tests/test_evgap_02_crc_linkage.py 44 tests;全库 Ran 353 tests OK;boundary check 通过
  • 15 个变异全部被捕获,逐个 diff -q 回滚干净

待上传的结果包(revision 2)

  • gen_iet_evgap_02_crc_linkage_20260805T190453Z_rev2.zip
  • ZIP SHA-256 e8f2a7f5ce9fae25265994f0d9a1fae1e371a1bb55ccafea2026835bd5120d3d
  • 41,734 bytes,8 个条目

EVGAP-02 未解除。ADC_POOL_LEVEL_01_ACCEPTED 不成立。

后续:本修订获批 → 另开 PR 处理 GAP-P07 → 执行 L-ASSERTION 抽取 → 结果 PR → 解除 EVGAP-02

@leezx leezx changed the title EVGAP-02 CRC linkage 抽取结果审核(Tier 1 已执行,20 条验证全通过) EVGAP-02:契约修订至 v0.2.0,运行降级为检索候选层(EVGAP-02 未解除) Aug 6, 2026
Second PR #62 review: revision 2 assigned CA19-9 to L3-00 although the contract
declares it resolved_as_non_protein_antigen — a status search_complete accepts.
The contradiction is direct and the review is right.

Root cause was mine: the contract table was named known_unresolved_entities but
held one resolved entity, and the rebuild script keyed L3-00 on membership in
that table rather than on resolution_status.

Fixed at the failure point: table renamed known_identity_findings, l3_00_statuses
added explicitly, l3_00_membership_test set to resolution_status,
l3_00_membership_by_list_forbidden set true, and every entry now declares the
lock_03_rule its status implies so the two cannot drift apart.

CA19-9 keeps its resolved status and moves to L3-01. Its pairs defer because the
assertion layer has not run and because a gene-symbol query is an invalid form
for a glycan antigen — not because the identity is unknown. New section
non_protein_antigen_search_requirements and rule VAL-L29 record that.

Revision 3: L3-00 27, L3-01 342. Still zero RETAIN, zero EXCLUDE, 369 hold,
empty assertion table, 979 candidates unchanged, no network call repeated.

GAP-P07 sharpened: the four entities are not one kind of defect. Whether a
resolved non-protein antigen belongs in a membrane-protein target universe is
the actual upstream question.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@leezx

leezx commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

第三轮修订:CA19-9 的 L3-00 误判已修正(27 / 342)

审核意见成立。契约把 CA19-9 定为 resolved_as_non_protein_antigen
search_complete_definition 明确接受该 status——它是已消歧的实体,不是身份未解析
revision 2 的 36/333 与契约直接冲突。

根因在我自己的命名与实现

契约那张表叫 known_unresolved_entities,里面却有一个 resolved 的条目
重建脚本按表成员身份而非按 resolution_statusL3-00
名字招来了这个 bug,脚本接受了邀请。

所以我修在失效点而不是症状:

  • 表改名 known_identity_findings
  • 新增 l3_00_statuses,只含两个 unresolvable_*
  • l3_00_membership_test: resolution_status
  • l3_00_membership_by_list_forbidden: true
  • 每个条目显式声明其 status 蕴含的 lock_03_rule,测试逐条比对二者自洽

采用方案一

CA19-9 保持 resolved_as_non_protein_antigen,转入 L3-01

新增 non_protein_antigen_search_requirements:非蛋白抗原不得按基因符号检索
v0.1.0 那 14,200 条 PMC 命中出自无效查询形式——
invalid_query_form_consequence: L3-01,即检索未完成,不是身份未解析
新增 VAL-L29

revision 3 结果

规则 pair 说明
L3-00 27 UndisclosedEDBNAG7 × 9
L3-01 342 CA19-9 的 9 个 pair

仍是 0 RETAIN、0 EXCLUDE、369 hold,三组 refs 全空,assertion 表空,
候选 979 未变,未重复任何网络调用

GAP-P07 已细化

四个实体性质不同,契约新增 entity_kinds 分列:三个是不可消歧的符号;
CA19-9 已消歧、只是不是蛋白——非蛋白抗原是否属于「所有潜在 ADC 膜蛋白靶点」
这一 target universe,才是 GAP-P07 真正要回答的问题。这一点你说得对,我原先把四者混为一谈了。

验证

  • 外部核验脚本的 L3-00 期望集由契约按 resolution_status 推导,非硬编码——同类错误再犯会被捕获。20 项全通过
  • tests/test_evgap_02_crc_linkage.py 47 tests;全库 Ran 356 tests OK;boundary check 通过
  • 10 个新变异全部被捕获diff -q 回滚干净

结果包(revision 3)

  • gen_iet_evgap_02_crc_linkage_20260805T190453Z_rev3.zip
  • ZIP SHA-256 ef268fd2f6dcc0c056b0dd01c67da5e850a5e79972ae5858dd49b5f60b49faac
  • 43,443 bytes,8 个条目

revision 2 从未上传,故其 36/333 未被任何下游依赖;rev2 包已删除以免误取。
你关于「实际 rev 包未提供前结果部分不能批准」的要求成立——该包需人工负责人上传
我无法代为附件上传,只能产出并声明校验和。

EVGAP-02 未解除。ADC_POOL_LEVEL_01_ACCEPTED 不成立。

PR #63 的 audit bundle 正在制作中,稍后单独提交。

leezx added a commit that referenced this pull request Aug 6, 2026
PR #63 review: the audit's core facts all come from files outside the
repository, and the in-repo tests only prove the audit document is internally
consistent. That is correct, and it is the same standard I applied to myself in
PR #62.

The bundle ships the builder source, both manifests, the checksum list, the raw
verification result, all three processed tables in full, the 41-target axis, and
a verifier. Running verify_audit.py recomputes 48 audit facts from the bundle
alone and reports each as MATCH or MISMATCH. All 48 match.

The tables are not subset. Subsetting would leave the 11,334 counterexample and
the duplicate-key counts unverifiable, putting the reviewer back to trusting the
narrative. 2.6 MB compressed is a fair price.

One limit stated rather than hidden: the 19 raw files are not shipped, so
AUD-09's byte-level verification cannot be redone inside the bundle. Their
digests were recomputed at audit time and are recorded. That limit is COND-03,
already declared, not a new one.

Recomputing found a wording problem. "11,334 genes with an HPA row but
hpa_plasma_membrane=false" is right — HPA covers 13,597 genes and 11,334 of them
are false — but 18,534 consensus rows carry that value, most because HPA never
covered the gene. The phrase "with an HPA row" carried the whole distinction.
All three figures are now reported and the test requires them. Under either
reading, zero genes wrongly credit the imaging family, so AUD-05 stands.

AUD-01's builder path was also ambiguous: it lives in the sibling AssetGenOS
repository, not inside StelligenOS. Corrected, and a copy ships in the bundle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
leezx and others added 2 commits August 6, 2026 15:49
…2-extraction-result

# Conflicts:
#	logs/worklog.md
… exact external review package requested in the previous review.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@leezx
leezx merged commit 17c5707 into main Aug 6, 2026
leezx added a commit that referenced this pull request Aug 6, 2026
ChatGPT APPROVE at a39171f.

Records only. No change to docs/pools, tests, contracts, the target axis or any
execution logic. admission_record_ref stays null, authorises_extraction_run
stays false, neither gap is lifted.

The reviewer's formal review again returned 403 from the GitHub connector, so
the two files merged here remain the only durable record of the #62 and #63
decisions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant